﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Clases.Clases;
using AccesoBD;
using Clases.Estructuras;
using System.Data.Sql;
using System.Data;
using System.Data.SqlClient;

namespace Clases.ClasesPersistentes
{
    public class DaoCarrera
    {
        public void insertarCarrera(Carrera pCarrera)
        {

            List<Parametros> parametros = new List<Parametros>();

            Parametros tmp01 = new Parametros("nombre", pCarrera.nombre);
            Parametros tmp02 = new Parametros("codigo", pCarrera.codigo);
            Parametros tmp03 = new Parametros("gradoAcademico", pCarrera.gradoAcademico);
            string cmdText = "INSERT INTO tcarrera (nombre, codigo, grado_academico) VALUES (@nombre, @codigo, @gradoAcademico); SELECT SCOPE_IDENTITY();";

            parametros.Add(tmp01);
            parametros.Add(tmp02);
            parametros.Add(tmp03);

            AccesoBD.DBAccess acceso = new DBAccess();

            String idCarreraTxt = acceso.ejectutarSqlConScopeIdentity(cmdText, parametros);
            int idCarrera = Int32.Parse(idCarreraTxt);
            Usuario directorAcademico = pCarrera.directorAcademico;
            int idDirectorAcademico = directorAcademico.idUsuario; 
            insertarDirectorAcademicoACarrera(idCarrera, idDirectorAcademico);
            
        }

        public void insertarDirectorAcademicoACarrera(int pCarrera, int pDirectorAcademico)
        {
            List<Parametros> parametros = new List<Parametros>();

            Parametros tmp01 = new Parametros("id_usuario", pDirectorAcademico);
            Parametros tmp02 = new Parametros("id_carrera", pCarrera);
            string cmdText = "INSERT INTO tusuario_carrera (id_usuario, id_carrera) VALUES (@id_usuario, @id_carrera)";

            parametros.Add(tmp01);
            parametros.Add(tmp02);

            AccesoBD.DBAccess acceso = new DBAccess();

            acceso.ejecutarSQL(cmdText, parametros);
        }

        public List<StrCarrera> listarCarreras()
        {
            StrCarrera tmpCarrera = new StrCarrera();
            List<StrCarrera> listaCarreras = new List<StrCarrera>();
            try
            {
                String cmdText = "SELECT nombre, codigo, grado_academico from tcarrera";
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, null);

                while (reader.Read())
                {
                    tmpCarrera.nombre = reader.GetValue(0).ToString();
                    tmpCarrera.codigo = reader.GetValue(1).ToString();
                    tmpCarrera.gradoAcademico = reader.GetValue(2).ToString();

                    listaCarreras.Add(tmpCarrera);
                }

                reader.Close();
                return listaCarreras;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public List<StrCarrera> buscarCarrerasAprox(String pnombreCarrera)
        {
            StrCarrera tmpCarrera = new StrCarrera();
            List<StrCarrera> listaCarreras = new List<StrCarrera>();
            try
            {
                String cmdText = "SELECT nombre, codigo, grado_academico from tcarrera WHERE (nombre LIKE '%' + @valor01 + '%')";
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("@valor01", pnombreCarrera);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);

                while (reader.Read())
                {
                    tmpCarrera.nombre = reader.GetValue(0).ToString();
                    tmpCarrera.codigo = reader.GetValue(1).ToString();
                    tmpCarrera.gradoAcademico = reader.GetValue(2).ToString();

                    listaCarreras.Add(tmpCarrera);
                }

                reader.Close();
                return listaCarreras;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public Carrera buscarCarreras(String pnombreCarrera)
        {
            Carrera tmpCarrera = new Carrera();
            try
            {
                String cmdText = "SELECT id_Carrera, nombre, codigo, grado_academico FROM tcarrera where nombre = @valor01";
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("@valor01", pnombreCarrera);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);

                while (reader.Read())
                {
                    tmpCarrera.idCarrera = (int)reader.GetValue(0);
                    tmpCarrera.nombre = reader.GetValue(1).ToString();
                    tmpCarrera.codigo = reader.GetValue(2).ToString();
                    tmpCarrera.gradoAcademico = reader.GetValue(3).ToString();
                }
                reader.Close();

                Usuario directorAcademico = buscarDAPorCarrera(tmpCarrera.idCarrera);

                tmpCarrera.directorAcademico = directorAcademico;
                return tmpCarrera;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }


        public Usuario buscarDAPorCarrera(int pidCarrera)
        {
            Usuario tmpDA = new Usuario();
            try
            {
                String cmdText = "SELECT tusuario.id_Usuario, tusuario.nombre, tusuario.apellido1, tusuario.apellido2, tusuario.cedula, tusuario.telefono, tusuario.nombre_Usuario FROM tcarrera INNER JOIN tusuario_carrera ON tcarrera.id_Carrera = tusuario_carrera.id_carrera INNER JOIN tusuario ON tusuario_carrera.id_usuario = tusuario.id_Usuario WHERE tusuario_carrera.id_carrera = @valor01";
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("@valor01", pidCarrera);
                parametros.Add(tmpParametro);
                AccesoBD.DBAccess acceso = new DBAccess();
                SqlDataReader reader = acceso.ejecutarSelect(cmdText, parametros);
                while (reader.Read())
                {
                    tmpDA.idUsuario = (int)reader.GetValue(0);
                    tmpDA.nombre = reader.GetValue(1).ToString();
                    tmpDA.apellido1 = reader.GetValue(2).ToString();
                    tmpDA.apellido2 = reader.GetValue(3).ToString();
                    tmpDA.cedula = reader.GetValue(4).ToString();
                }
                reader.Close();

                return tmpDA;
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

        public void modificarCarrera(Carrera pcarrera)
        {
            try
            {
                String cmdText = "UPDATE tcarrera set nombre = @valor01, codigo = @valor02, grado_academico = @valor03 WHERE codigo = @valor02";
                AccesoBD.DBAccess accesso = new DBAccess();
                Parametros tmpParametro;
                List<Parametros> parametros;
                parametros = new List<Parametros>();
                tmpParametro = new Parametros("@valor01", pcarrera.nombre);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("@valor02", pcarrera.codigo);
                parametros.Add(tmpParametro);
                tmpParametro = new Parametros("@valor03", pcarrera.gradoAcademico);
                parametros.Add(tmpParametro);
                accesso.ejecutarSQL(cmdText, parametros);
            }
            catch (SqlException e)
            {
                throw e;
            }
        }

    }
}
